<html>
    <head>
        <title>预配置</title>
    </head>
    <body>
        <script>
            /*
                        四、预配置
                                选项模式的一个限制是，你只能在依赖项注入且配置完成后注入IOptions<TOptions>才能获取选项值。(这意味着必须等所有模块的 ConfigureServices方法执行完成后才行)

                                如果你正在开发一个模块，你可能需要允许开发人员设置一些选项，并在依赖注入注册阶段使用这些配置。
                                （你可能需要配置其他服务或根据这些选项值更改依赖注入注册代码。）

                                对于这种情况，ABP 为IServiceCollection引入了 PreConfigure<TOptions> 和 ExecutePreConfiguredActions<TOptions>扩展方法。
                                该模式的工作原理如下所述：

                                    1、在模块中定义一个"预配置选项类"：
                                            public class MyPreOptions
                                            {
                                                public bool MyValue { get; set; }
                                            }

                                    2、然后任何依赖你模块的"模块类"都可以在其 PreConfigureServices 方法中使用 PreConfigure<TOptions>方法。
                                            eg：
                                                public override void PreConfigureServices(ServiceConfigurationContext context)
                                                {
                                                    PreConfigure<MyPreOptions>(options =>
                                                    {
                                                        options.MyValue = true;
                                                    });
                                                }

                                            多个模块可以预先配置选项并根据其依赖顺序覆盖选项值

                                    3、最后，你的模块可以执行 ExecutePreConfiguredActions
                                            eg:
                                                public override void ConfigureServices(ServiceConfigurationContext context)
                                                {
                                                    var options = context.Services.ExecutePreConfiguredActions<MyPreOptions>();
                                                    if (options.MyValue)
                                                    {
                                                        //...
                                                    }
                                                }
                    */
        </script>
    </body>
</html>